组合式 API
组合式 API 中的导入以及顶层变量以及函数都可以直接使用。响应式更新的核心在于 ref
。使用 ref
包裹的变量可以变成响应式的变量,可以直接在 template
以及 script
中使用或者更新。
ref
可以绑定到组件的属性,使用方法为:prop="refValue"
进行绑定,""
当中不止可以只写 refValue
还可以直接写 js 的代码,例如 :prop="refValue? a:b"
。也可以绑定到显示的内容,使用 进行绑定,
中同样可以写简单的 js 代码。
vue
<script setup>
import { ref, onMounted } from 'vue'
// 响应式状态
const count = ref(0)
// 用来修改状态、触发更新的函数
function increment() {
count.value++
}
// 生命周期钩子
onMounted(() => {
console.log(`The initial count is ${count.value}.`)
})
</script>
<template>
<button @click="increment">Count is: {{ count }}</button>
</template>
组件的相关声明
VUE 中可给组件自定义各种功能,外部组件在声明这个组件的时候可以通过关键字开启这些功能。
支持的功能包括:属性、事件、v-model,指令
v-model 的属性和属性类似,但是属性只能单向绑定,数据从父组件流向子组件,在子组件中无法修改数据的值,正常的修改属性的值需要结合事件传递新的值,在父组件中更新新的值,v-model 简化了这一过程。
示例代码如下:
vue
<script setup lang="ts">
import { ref } from "vue";
defineOptions({
name: "EditableSteps"
});
// 定义自定义属性,父组件可以通过 :psimple="value" peditable="true" 静态地或者动态地指定属性的值
const props = defineProps({
psimple: {
type: Boolean,
default: false
},
peditable: {
type: Boolean,
default: false
}
});
// 定义自定义事件,父组件可以通过@update-current="event" 来绑定事件
const emit = defineEmits(["update-current"]);
// v-model
const vmCurrent = defineModel<number>("current", { default: 0 });
const vmSteps = defineModel<Array<string>>("steps", { default: [] });
// 切换到指定步骤
function setActiveStep(index) {
// 非可编辑模式
if (!props.peditable) {
return;
}
// 验证步骤的有效性
if (index >= 0 && index <= vmSteps.value.length - 1) {
vmCurrent.value = index + 1;
}
// 触发更新事件
emit("update-current", vmCurrent.value);
}
</script>
<template>
<div class="w-full">
<el-steps
:active="vmCurrent"
finish-status="success"
class="w-full"
:simple="props.psimple"
>
<el-step
v-for="(step, index) in vmSteps"
:key="index"
class="select-none"
:class="props.peditable ? 'cursor-pointer' : ''"
:title="step"
@click="() => setActiveStep(index)"
/>
</el-steps>
</div>
</template>
<style lang="scss" scoped></style>
特殊模版指令
vue 中提供了多种可以帮助控制界面显示的指令。例如
Vue.js中的v-for
和v-if
是两个非常常用且强大的指令,用于列表渲染和条件渲染。下面分别给出它们的基本用法以及结合使用的示例。
v-for 指令
v-for
指令用于遍历数组、对象或整数区间来渲染列表。基本语法是 v-for="item in items"
,其中items
是你要遍历的数据源,item
是当前遍历到的元素的别名。遍历所生成的对象需要指定一个额外的 :key
参数用于唯一的标识对象的序号。
示例代码:
html
<template>
<div>
<ul>
<!-- 遍历数组 -->
<li v-for="item in items" :key="item.id">{{ item.text }}</li>
</ul>
<!-- 遍历对象 -->
<ul>
<li v-for="(value, key) in user" :key="key">{{ key }}: {{ value }}</li>
</ul>
<!-- 遍历整数 -->
<div v-for="n in 5" :key="n">{{ n }}</div>
</div>
</template>
<script>
export default {
data() {
return {
items: [
{ id: 1, text: 'Item 1' },
{ id: 2, text: 'Item 2' },
{ id: 3, text: 'Item 3' }
],
user: {
name: 'Alice',
age: 30,
city: 'New York'
}
};
}
};
</script>
v-if 指令
v-if
指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回真值时被渲染。
示例代码:
html
<template>
<div>
<!-- 条件渲染 -->
<p v-if="seen">true show</p>
<p v-else>false show</p>
</div>
</template>
<script>
export default {
data() {
return {
seen: true
};
}
};
</script>